package com.zhoujing.myrabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 周敬
 * @version 1.0
 * @createTime 2022/7/19-11:07-星期二
 * <p>
 * TTL队列
 */
@Configuration
public class TtlQueueConfig {
    /**
     * 普通交换机名称
     */
    public static final String EXCHANGE_NAME = "X";
    /**
     * 死信交换机名称
     */
    public static final String DEAD_EXCHANGE_NAME = "Y";
    /**
     * 普通队列名称
     */
    public static final String[] QUEUE_NAME = {"QA", "QB", "QC"};
    /**
     * 死信队列名称
     */
    public static final String DEAD_QUEUE_NAME = "QD";

    /**
     * 声明 X 交换机
     *
     * @return
     */
    @Bean("xExchange")
    public DirectExchange xExchange() {
        return new DirectExchange(EXCHANGE_NAME);
    }

    /**
     * 声明 Y 死信交换机
     *
     * @return
     */
    @Bean("yExchange")
    public DirectExchange yExchange() {
        return new DirectExchange(DEAD_EXCHANGE_NAME);
    }

    /**
     * 声明 普通队列QA
     *
     * @return
     */
    @Bean("aQueue")
    public Queue aQueue() {
        // 不用实例化，可以直接构建队列
        /*
         * durable：持久化队列
         * ttl：设置缓存过期时间，毫秒为单位
         * deadLetterExchange：设置对应的死信交换机
         * deadLetterRoutingKey：死信交换机RoutingKey
         * */
        return QueueBuilder.durable(QUEUE_NAME[0])
                .ttl(10000)
                .deadLetterExchange(DEAD_EXCHANGE_NAME)
                .deadLetterRoutingKey("YD").build();
    }

    /**
     * 声明 普通队列QB
     *
     * @return
     */
    @Bean("bQueue")
    public Queue bQueue() {
        return QueueBuilder.durable(QUEUE_NAME[1])
                .ttl(40000)
                .deadLetterExchange(DEAD_EXCHANGE_NAME)
                .deadLetterRoutingKey("YD").build();
    }

    /**
     * 声明 普通队列QC
     * 不进行过期时间设置
     *
     * @return
     */
    @Bean("cQueue")
    public Queue cQueue() {
        return QueueBuilder.durable(QUEUE_NAME[2])
                .deadLetterExchange(DEAD_EXCHANGE_NAME)
                .deadLetterRoutingKey("YD")
                .build();
    }

    /**
     * 声明 死信队列QD
     *
     * @return
     */
    @Bean("dQueue")
    public Queue dQueue() {
        return QueueBuilder.durable(DEAD_QUEUE_NAME).build();
    }

    /**
     * OA队列绑定 X 交换机
     *
     * @param aQueue    QA队列
     * @param xExchange X 交换机
     * @return
     */
    @Bean
    public Binding queueQABinDingX(@Qualifier("aQueue") Queue aQueue, @Qualifier("xExchange") DirectExchange xExchange) {
        // BindingBuilder.bind(队列名称).to(交换机名称).with(路由Key);
        return BindingBuilder.bind(aQueue).to(xExchange).with("XA");
    }

    /**
     * QB队列绑定 X 交换机
     *
     * @param bQueue    QB队列
     * @param xExchange X 交换机
     * @return
     */
    @Bean
    public Binding queueQBBinDingX(@Qualifier("bQueue") Queue bQueue, @Qualifier("xExchange") DirectExchange xExchange) {
        return BindingBuilder.bind(bQueue).to(xExchange).with("XB");
    }

    /**
     * QC队列绑定 X 交换机
     *
     * @param cQueue    QC队列
     * @param xExchange X 交换机
     * @return
     */
    @Bean
    public Binding queueQCBinDingX(@Qualifier("cQueue") Queue cQueue, @Qualifier("xExchange") DirectExchange xExchange) {
        return BindingBuilder.bind(cQueue).to(xExchange).with("XC");
    }

    /**
     * QD队列绑定 Y 交换机
     *
     * @param dQueue    QD队列
     * @param yExchange Y 交换机
     * @return
     */
    @Bean
    public Binding queueDBinDingY(@Qualifier("dQueue") Queue dQueue, @Qualifier("yExchange") DirectExchange yExchange) {
        return BindingBuilder.bind(dQueue).to(yExchange).with("YD");
    }


}
